/**
 * 格式化工具模块
 * 提供各种格式化函数
 */

/**
 * 格式化数字，添加千位分隔符
 * @param {number} num 要格式化的数字
 * @param {number} decimals 保留小数位数
 * @returns {string} 格式化后的数字字符串
 */
export function formatNumber(num, decimals = 0) {
  if (num === undefined || num === null) return '0';
  
  return Number(num).toLocaleString('zh-CN', {
    minimumFractionDigits: decimals,
    maximumFractionDigits: decimals
  });
}

/**
 * 格式化百分比
 * @param {number} value 百分比值（0-100）
 * @param {number} decimals 保留小数位数
 * @returns {string} 格式化后的百分比字符串
 */
export function formatPercent(value, decimals = 0) {
  if (value === undefined || value === null) return '0%';
  
  return `${Number(value).toFixed(decimals)}%`;
}

/**
 * 格式化文件大小
 * @param {number} bytes 字节数
 * @param {number} decimals 保留小数位数
 * @returns {string} 格式化后的文件大小字符串
 */
export function formatFileSize(bytes, decimals = 2) {
  if (bytes === 0) return '0 Bytes';

  const k = 1024;
  const dm = decimals < 0 ? 0 : decimals;
  const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

  const i = Math.floor(Math.log(bytes) / Math.log(k));

  return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
}

/**
 * 将秒数转换为人类可读的时间字符串
 * @param {number} seconds 秒数
 * @returns {string} 格式化后的时间字符串
 */
export function formatDuration(seconds) {
  if (!seconds || seconds < 0) return '0秒';
  
  const days = Math.floor(seconds / 86400);
  const hours = Math.floor((seconds % 86400) / 3600);
  const minutes = Math.floor((seconds % 3600) / 60);
  const secs = Math.floor(seconds % 60);
  
  const parts = [];
  
  if (days > 0) parts.push(`${days}天`);
  if (hours > 0) parts.push(`${hours}小时`);
  if (minutes > 0) parts.push(`${minutes}分钟`);
  if (secs > 0 && parts.length < 2) parts.push(`${secs}秒`);
  
  return parts.join(' ');
}

/**
 * 格式化日期时间
 * @param {string} dateStr 日期字符串
 * @param {boolean} includeTime 是否包含时间
 * @returns {string} 格式化后的日期时间字符串
 */
export function formatDateTime(dateStr, includeTime = true) {
  if (!dateStr) return '';
  
  try {
    const date = new Date(dateStr);
    if (isNaN(date.getTime())) {
      return dateStr;
    }
    
    if (includeTime) {
      // 使用标准格式 YYYY-MM-DD HH:MM:SS
      return date.toLocaleString('zh-CN', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit',
        hour12: false
      }).replace(/\//g, '-');
    } else {
      // 只返回日期部分 YYYY-MM-DD
      return date.toLocaleDateString('zh-CN', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
      }).replace(/\//g, '-');
    }
  } catch (e) {
    console.error('日期格式化错误:', e);
    return dateStr;
  }
}

/**
 * 格式化头像URL
 * @param {string} avatar 头像路径或base64字符串
 * @param {string} defaultAvatar 默认头像
 * @returns {string} 格式化后的头像URL
 */
export function formatAvatarUrl(avatar, defaultAvatar = '') {
  if (!avatar) {
    return defaultAvatar;
  }
  
  // 如果是base64格式（以data:开头），直接返回
  if (avatar.startsWith('data:')) {
    return avatar;
  }
  
  // 如果已经是完整URL（以http开头），直接返回
  if (avatar.startsWith('http')) {
    return avatar;
  }
  
  // 从后端返回的路径是相对于服务器根目录的，例如 /static/avatars/xxx.png
  // 需要通过API基础URL来构建完整路径
  const baseUrl = import.meta.env.VITE_API_BASE_URL || '';
  
  // 如果是以/开头的相对路径，添加API基础URL前缀
  if (baseUrl && !baseUrl.startsWith('/')) {
    // 生产环境或自定义域名，需要拼接完整URL
    return `${baseUrl}${avatar}`;
  } else {
    // 开发环境，使用相对路径（会通过代理转发）
    return avatar;
  }
}

export default {
  formatNumber,
  formatPercent,
  formatFileSize,
  formatDuration,
  formatDateTime,
  formatAvatarUrl
};